﻿using System;
using System.Data;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implementa BLPresupuestos
    /// </summary>
    class BLIMPLPresupuestos:Presupuesto_BL.BLPresupuestos
    {
        DAOPresupuestos createPresupuesto = DAOFactoryPresupuesto.createPresupuesto();
        BLEquipo createEquipo = BLFactoryPresupuesto.createEquipo();

        /// <summary>
        /// Guarda un presupuesto
        /// </summary>
        /// <param name="p">Objeto con los datos del presupuesto a guardar</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool savePresupuesto(presupuestosDTO p)
        {
            Boolean correcto = false;

            try
            { 
                Boolean insertado = createPresupuesto.savePresupuesto(p.TipoPresupuesto, p.Codigo, p.Precio, p.Fecha, p.Estado, p.FormaPago, p.PlazoEntrega, p.EjecucionTrabajo, 
                    p.CondicionesGenerales, p.EsProforma, p.Cif, p.Fob, p.CodFactura, p.Activo);

                if (insertado )
                {
                    correcto = true;
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;

        }

        /// <summary>
        /// Modifica un presupuesto
        /// </summary>
        /// <param name="p">Objeto con los datos del presupuesto a modificar</param>
        /// <param name="codigo">Determina que presupuesto se va modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updatePresupuesto(presupuestosDTO p, String codigo)
        {
            Boolean correcto = false;

            try
            {
                presupuestos pre = createPresupuesto.getPresupuesto(codigo);

                if (null != pre)
                {
                    Boolean modificado = createPresupuesto.updatePresupuesto(p.TipoPresupuesto, p.Codigo, p.Precio, p.Fecha, p.Estado, p.FormaPago, p.PlazoEntrega,
                        p.EjecucionTrabajo, p.CondicionesGenerales, p.EsProforma, p.Cif, p.Fob, p.CodFactura, p.Activo, pre.ID);

                    if (modificado)
                    {
                        correcto = true;
                    }    
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Elimina un presupuesto
        /// </summary>
        /// <param name="codigo">Determina que presupuesto va a ser eliminado</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deletePresupuesto(string codigo)
        {
            Boolean correcto = false;

            try
            {
                Boolean eliminado = createPresupuesto.deletePresupuesto(codigo);

                if (eliminado)
                {
                    correcto = true;
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Lista todos los presupuestos
        /// </summary>
        /// <returns>Devuelve una tabla con todos los presupuestos</returns>
        public DataTable getAllPresupuesto()
        {
            DataTable listadoPresupuestos = null;

            try
            {
                DataTable presupuestos = createPresupuesto.getAllPresupuesto();

                if (null != presupuestos)
                {
                    listadoPresupuestos = presupuestos;
                }
            }
            catch (Exception ex)
            {

                listadoPresupuestos = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }


            return listadoPresupuestos;
        }

        /// <summary>
        /// Obtiene un presupuesto
        /// </summary>
        /// <param name="codigo">Determina el presupuesto a obtener</param>
        /// <returns>Devuelve un objeto presupuesto</returns>
        public presupuestosDTO getPresupuesto(string codigo)
        {
            presupuestosDTO p = null;

            try
            {
                presupuestos pre = createPresupuesto.getPresupuesto(codigo);

                if (null != pre)
                {
                    p = new presupuestosDTO();
                    p.TipoPresupuesto = pre.TipoPresupuesto;
                    p.Precio = pre.Precio;
                    p.PlazoEntrega = pre.PlazoEntrega;
                    p.ID = pre.ID;
                    p.FormaPago = pre.FormaPago;
                    p.Fob = pre.Fob;
                    p.Fecha = pre.Fecha;
                    p.Estado = pre.Estado;
                    p.EsProforma = pre.EsProforma;
                    p.EjecucionTrabajo = pre.EjecucionTrabajo;
                    p.CondicionesGenerales = pre.CondicionesGenerales;
                    p.Codigo = pre.Codigo;
                    p.CodFactura = pre.CodFactura;
                    p.Cif = pre.Cif;
                    p.Activo = pre.Activo;

                }
            }
            catch (Exception ex)
            {

                p = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return p;
        }

        /// <summary>
        /// Obtiene el mayor id de la tabla prespuestos
        /// </summary>
        /// <returns>Devuelve un entero con el valor del id</returns>
        public int getMaxId()
        {
            int maxId = 0;

            try
            {
                int id = createPresupuesto.getMaxId();

                if (id != 0)
                {
                    maxId = id;
                }
            }
            catch (Exception ex)
            {

                maxId = 0;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return maxId;
        }
    }
}
